package main

import (
	"fmt"
)

const (
	MAX int = 3
)

func main() {
	/* 指针 */
	pointer()

	/* 指针数组 */
	pointerArray()

	/* 指向指针的指针 */
	toPointerOfPointer()

	/* 指针作为函数参数 */
	var a = 19
	var b = 23
	fmt.Printf("交换前 a 的值 : %d\n", a)
	fmt.Printf("交换前 b 的值 : %d\n", b)
	swap(&a, &b)
	fmt.Printf("交换后 a 的值 : %d\n", a)
	fmt.Printf("交换后 b 的值 : %d\n", b)
}

/**
指针作为函数参数
*/
func swap(x *int, y *int) {
	var temp int
	temp = *x /* 保存 x 地址的值 */
	*x = *y   /* 将 y 赋值给 x */
	*y = temp /* 将 temp 赋值给 y */
}

/**
指向指针的指针
*/
func toPointerOfPointer() {
	var p int
	var pp *int
	var ppp **int
	p = 2000

	/* 指针pp地址 */
	pp = &p

	/* 指向指针pp地址*/
	ppp = &pp

	/* 获取 pptr 的值 */
	fmt.Printf("变量 p = %d\n", p)
	fmt.Printf("变量 p = %x\n", &p)
	fmt.Printf("指针变量 *pp = %d\n", *pp)
	fmt.Printf("指向指针的指针变量 **ppp = %d\n", **ppp)

}

/**
指针数组
*/
func pointerArray() {
	a := [MAX]int{100, 200, 300}
	var i int
	var ptr [MAX]*int

	for i := 0; i < MAX; i++ {
		ptr[i] = &a[i] /* 整数地址赋值给指针数组 */
	}

	for i = 0; i < 1; i++ {
		fmt.Printf("a[%d] = %d\n", i, *ptr[i])
		fmt.Printf("a[%d] = %d\n", i, ptr[i])
		fmt.Printf("a[%d] = %d\n", i, &ptr[i])

		fmt.Printf("a[%d] = %d\n", i, a[i])
		fmt.Printf("a[%d] = %d\n", i, &a[i])
	}

}

/**
变量内存地址
*/
func pointer() {
	/* 实际变量*/
	var p int = 1
	/* 指针变量 */
	var ip *int

	fmt.Printf("&p 变量的内存地址是：%x \n", &p)

	fmt.Printf("ip 指针变量初始值：%x \n", ip)
	fmt.Printf("&ip 指针变量的内存地址：%x \n", &ip)

	ip = &p
	fmt.Printf("ip 指针变量储存的指针地址：%x \n", ip)
	fmt.Printf("*ip 指针变量的值：%x \n", *ip)
	fmt.Printf("&ip 指针变量的内存地址：%x \n", &ip)

}
